package br.ufmt.eit.cursos.dao;

import java.sql.Connection;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.hibernate.Session;
import org.hibernate.ejb.EntityManagerImpl;

public class DAO<VO>
{

    private static EntityManagerFactory entityManagerFactory;
    private EntityManager gerenteEntidade;

    private void fabricarGerenteEntidade(String nomeUnidadePersistencia) {
        entityManagerFactory = Persistence.createEntityManagerFactory(nomeUnidadePersistencia);


    }

    public EntityManager novoGerenteEntidade() {
        return DAO.entityManagerFactory.createEntityManager();
    }

    public EntityManager getGerenteEntidade()
    {
        return gerenteEntidade;
    }

    public DAO() 
    {
        if(entityManagerFactory ==null)
            this.fabricarGerenteEntidade("cursosPU");
        if(gerenteEntidade ==null)
            this.gerenteEntidade = this.novoGerenteEntidade();
    }
    public void inserir(VO vo) {
        this.gerenteEntidade.persist(vo);
    }
    public void alterar(VO vo) {
        this.gerenteEntidade.merge(vo);

    }
    public void excluir(VO vo) {
        this.gerenteEntidade.remove(vo);
    }

    public void remover(VO vo)
    {
        this.gerenteEntidade.remove(vo);
    }
    public List<VO> getTodos(String className)
    {
      Query query = gerenteEntidade.createQuery("from "+className);
      return query.getResultList();
    }
    public Long getCount(String className)
    {
    	Query query = gerenteEntidade.createQuery("select count(*) from "+className);
        return (Long) query.getSingleResult();
    }
    public void iniciarTransacao(){
        this.gerenteEntidade.getTransaction().begin();
    }
    public void confirmarTransacao(){
        this.gerenteEntidade.getTransaction().commit();
    }
    public void cancelarTransacao(){
        this.gerenteEntidade.getTransaction().rollback();
    
    }
    public boolean estaAbertaTransacao()
    {
       return this.gerenteEntidade.getTransaction().isActive();
    }


    public Connection getConexao()
    {
        Session session;
        if (gerenteEntidade.getDelegate() instanceof EntityManagerImpl) {
            EntityManagerImpl entityManagerImpl = (EntityManagerImpl) gerenteEntidade.getDelegate();
            session = entityManagerImpl.getSession();
        } else {
            session = (Session) gerenteEntidade.getDelegate();
        }
        return session.connection();
    }
}

